package piano

import (
	"fmt"
	"gitee.com/showurl/ugly/config"
	"gitee.com/showurl/ugly/models"
	"gitee.com/showurl/ugly/sheets"
	"gitee.com/showurl/ugly/utils"
	"github.com/go-vgo/robotgo"
	"net/url"
	"strconv"
	"strings"
)

func TapKeys() {
	// 获取乐谱和乐谱类型
	sounds, sheetType := config.Config.App.GetSounds()
	var pianoMap map[string]models.ModelPiano
	switch sheetType {
	// 简谱 小数字
	case sheets.SheetTypeNum:
		pianoMap = models.NumPianoMap()
	// 本程序定义的数字
	case sheets.SheetTypeApp:
		pianoMap = models.AppPianoMap()
	default:
		panic("乐谱类型不正确")
	}
	// 预备音
	{
		for _, k := range []string{`A`, `S`, `D`, `A`} {
			utils.ToggleWithMills(k, config.Config.Logic.PianoSleepTime(2))
		}
	}
	// 遍历乐谱的每一个音
	for _, s := range sounds {
		var path string
		var t string
		// 有 # 号的话 url识别不出来
		if strings.HasPrefix(s, "#") {
			uri, err := url.Parse(strings.TrimPrefix(s, "#"))
			if err != nil {
				panic(err)
			}
			t = uri.Query().Get("t")
			path = "#" + uri.Path
		} else {
			uri, err := url.Parse(s)
			if err != nil {
				panic(err)
			}
			t = uri.Query().Get("t")
			path = uri.Path
		}
		// 把 ?t= 识别出来 这个字段决定长按钢琴键的时间
		var mills int
		{
			tm, err := strconv.ParseFloat(t, 64)
			if err != nil {
				fmt.Printf("s:%s", s)
				panic(err)
			}
			// 这个时间就是长按钢琴键的时间 单位毫秒
			mills = config.Config.Logic.PianoSleepTime(tm)
		}
		// 得到模型
		piano, ok := pianoMap[path]
		var key = ""
		if ok {
			key = piano.SoftKey
		}
		if key == "" {
			// 钢琴空键 那直接休眠空键长按时间
			robotgo.MilliSleep(mills)
		} else {
			// key 有可能是 Z?X 这种组合 可能会表示力度和升降8度
			// 遇到这种key直接按一下即可 不用长按
			for _, ch := range key {
				k := string(ch)
				if CanLongTap(k) {
					utils.ToggleWithMills(k, mills)
				} else {
					robotgo.KeyTap(k)
				}
			}
		}
	}
}
